﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using UI.Data;
using UI.Helpers;
using System.Net.Mail;

namespace UI.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Product/
        private readonly SPORTSALEEntities context = new SPORTSALEEntities();

        public ActionResult Index(int id)
        {
            return View(context.Ventas.Where(x => x.Id == id).First());
        }

        public ActionResult List()
        {
            ViewData["Deportes"] = context.Deportes;
            ViewData["Categorias"] = context.Categorias;

            return View(context.Ventas.Where(x =>
                    x.IdUsuario != MySession.Current.UserId
                    && x.Usuarios.Activo == 1
                    && x.Producto.Stock > 0
                ));
        }

        [HttpPost]
        public ActionResult List(FormCollection col)
        {
            ViewData["Deportes"] = context.Deportes;

            int deporte = int.Parse(col["Deporte"] == null ? "0" : col["Deporte"]);
            double precio = double.Parse(col["txtPrecio"] == string.Empty ? "0" : col["txtPrecio"]);
            int valoracion = int.Parse(col["txtValoracion"] == string.Empty ? "0" : col["txtValoracion"]);

            return View(context.Ventas.Where(
                x => (x.Producto.IdDeporte == deporte || deporte == 0)
                && (x.Producto.Precio == precio || precio == 0)
                && (x.Usuarios.Puntos >= valoracion || valoracion == 0)
                && x.Producto.Stock > 0
                && x.IdUsuario != MySession.Current.UserId
                && x.Usuarios.Activo == 1
                ));
        }

        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Producto p, HttpPostedFileBase Imagen)
        {
            if (MySession.Current.UserId == 0)
            {
                ModelState.AddModelError("", "Primero debe inicar sesión para poder realizar una publicación");
                return View();
            }

            var col = Request.Files[0];

            Ventas v = new Ventas();
            context.Producto.AddObject(p);
            context.SaveChanges();

            v.IdProducto = p.Id;
            v.IdUsuario = MySession.Current.UserId;

            Valoraciones val = new Valoraciones();
            context.Valoraciones.AddObject(val);
            context.SaveChanges();

            v.IdValoracion = val.Id;

            context.Ventas.AddObject(v);
            context.SaveChanges();

            return RedirectToAction("Index", "Home");
        }

        [HttpPost]
        public ActionResult UploadProductImage()
        {
            return View();
        }

        public ActionResult Buy(string id)
        {
            if (!String.IsNullOrEmpty(id))
            {
                int auxId = int.Parse(id);
                return View(context.Ventas.Where(x => x.Id == auxId).First());
            }
            else
                return View();
        }

        [HttpPost]
        public ActionResult Buy(string id, FormCollection col)
        {
            int auxId = int.Parse(id);
            Ventas v = context.Ventas.Where(x => x.Id == auxId).First();

            if (MySession.Current.UserId == 0)
            {
                ModelState.AddModelError("ValidationSummary1", "Por favor inicie sesion para realizar una compra");
                return View(v);
            }
            else if (v.Producto.Stock < int.Parse(col["Producto.Stock"]))
            {
                ModelState.AddModelError("ValidationSummary1", "Usted solo puede comprar hasta " + v.Producto.Stock + " " + v.Producto.Nombre);
                return View(v);
            }
            else
            {
                Usuarios seller = context.Usuarios.Where(x => x.Id == v.Usuarios.Id).First();
                Usuarios buyer = context.Usuarios.Where(x => x.Id == MySession.Current.UserId).First();

                v.Producto.Stock -= int.Parse(col["Producto.Stock"]);

                MailMessage mail = new MailMessage();
                mail.To.Add(seller.Email);
                mail.From = new MailAddress(buyer.Email);
                mail.Subject = "Compra de: " + v.Producto.Nombre;
                string Body = "Un usuario ha realizado la compra de un producto que estas vendiendo!";
                mail.Body = Body;
                mail.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient();
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
                smtp.UseDefaultCredentials = false;
                smtp.Credentials = new System.Net.NetworkCredential
                ("sportsale2@gmail.com", "unaprueba");// Enter sender User name and password
                smtp.EnableSsl = true;

                Compras c = new Compras();
                c.Codigo = new Guid().ToString();
                c.Fecha = DateTime.Now;
                c.Producto = v.Producto;
                c.Usuarios = buyer;
                c.Cantidad = int.Parse(col["Producto.Stock"]);
                c.Estado = eEstadoCompra.Negociación.ToString();

                context.Compras.AddObject(c);

                try
                {
                    smtp.Send(mail);
                }
                catch (Exception)
                {
                    ModelState.AddModelError("ValidationSummary1", "Error al enviar correo al vendedeor");
                    context.SaveChanges();
                    return View(context.Ventas.Where(x => x.Id == auxId).First());
                }

                context.SaveChanges();

                return View("FinalBuy", context.Ventas.Where(x => x.Id == auxId).First());
            }
        }

        public ActionResult FinalBuy(string id)
        {
            if (!String.IsNullOrEmpty(id))
            {
                int auxId = int.Parse(id);
                Ventas v = context.Ventas.Where(x => x.Id == auxId).First();
                return View(v);
            }
            else
                return View();
        }

        [HttpPost]
        public ActionResult Comment(int idVenta, string comentario)
        {
            return View("Buy", context.Ventas.Where(x => x.Id == idVenta).First());
        }

        //
        // GET: /Product/Edit/5

        public ActionResult Valorar(int idVenta, int userId)
        {
            TempData["IdVenta"] = idVenta;
            TempData["IdUsuario"] = userId;

            return View();
        }

        //
        // POST: /Product/Edit/5

        [HttpPost]
        public ActionResult Valorar(string idVenta, string userId, FormCollection col)
        {
            try
            {
                int idVentaa = String.IsNullOrEmpty(idVenta) ? int.Parse(TempData["IdVenta"].ToString()) : int.Parse(idVenta);
                int idUsuario = String.IsNullOrEmpty(userId) ? int.Parse(TempData["IdUsuario"].ToString()) : int.Parse(userId);
                int valoracion = int.Parse(col["cboValoracion"]);

                int idProducto = context.Ventas.Where(x => x.Id == idVentaa).First().IdProducto;

                context.Ventas.Where(x => x.Id == idVentaa).First().Usuarios.Puntos += valoracion;

                if (idUsuario == context.Ventas.Where(x => x.Id == idVentaa).First().Usuarios.Id)
                    context.Ventas.Where(x => x.Id == idVentaa).First().Valoraciones.ValoracionVendedor = valoracion;
                else
                    context.Ventas.Where(x => x.Id == idVentaa).First().Valoraciones.ValoracionComprador = valoracion;

                Valoraciones val = context.Ventas.Where(x => x.Id == idVentaa).First().Valoraciones;

                //if (val.ValoracionComprador > 0 && val.ValoracionVendedor > 0)
                foreach (Usuarios u in context.Usuarios)
                    if (u.Compras.Any(x => x.IdProducto == idProducto))
                    {
                        Compras comp = u.Compras.Where(x => x.IdProducto == idProducto).First();
                        if ((DateTime.Now - comp.Fecha).Days > 3)
                        {
                            comp.Estado = eEstadoCompra.Concretada.ToString();
                        }
                        else
                        {
                            Response.Write("<script>alert('Deben pasar al menos 4 dias para poder valorar');</script>");
                            //return RedirectToAction("Index", new { idVenta = idVentaa, });
                        }
                    }
                context.SaveChanges();
                return RedirectToAction("Index", new { id = idVentaa, userId = userId });
            }
            catch
            {
                return View();
            }
        }
    }
}
